package com.rocketmq.temp3.common.constant;

/**
 * 1、科普一下：多个spring-AOP的执行顺序 - order越小越是最先执行。
 * 注意，当有多个切面表达式作用于同一个切点时，各个切面的执行顺序需要在这里指定下；
 * 2、接口AspectConstant下的每个枚举中定义的内容都是一组切面的执行顺序关系；
 * 3、如果有必要，可以分离各切面中定义的逻辑，为了更灵活的控制不同逻辑的执行顺序，
 * 可以根据需要定义若干个切面，控制不同方法上不同切面的执行顺序；
 * 4、这里每个枚举中定义的一组切面常量都共同作用于同一个类的成员方法。
 * 【重要】5、另外，需要额外特别说明：既然要管理同一个切点不同切面的执行顺序，那么在定义不同的切面时，这些切面的拦截范围就很有必要保持一致。
 * （这一点必须达成共识，是保证编码可扩展性与可延伸性以及易维护性的约定！！！）
 * 6、这里枚举的命名规范，通过枚举的名称要能够看得出来一组切面的拦截范围
 */
public interface AspectConstant {
    /**
     * 定义com.deppon.ump.sms.api.restcontroller.ApiController类成员方法上不同切面的执行顺序
     */
    enum RestControllerAopConstant {
        REQUEST_ADVICE(111, "API请求日志打印"),
        SIGNATURE_ADVICE(121, "API接口签名校验");

        private Integer ordered;
        private String desc;

        RestControllerAopConstant(Integer ordered, String desc) {
            this.ordered = ordered;
            this.desc = desc;
        }

        public Integer getOrdered() {
            return ordered;
        }

        public String getDesc() {
            return desc;
        }
    }

    /**
     * 定义com.deppon.ump.sms.service.RepositoryService类成员方法上不同切面的执行顺序
     */
    enum ServiceAopConstant {
        LOG_ADVICE(888, "记录方法的入参与返回值"),
        CACHE_ADVICE(999, "缓存服务方法返回结果");
        private Integer ordered;
        private String desc;

        ServiceAopConstant(Integer ordered, String desc) {
            this.ordered = ordered;
            this.desc = desc;
        }

        public Integer getOrdered() {
            return ordered;
        }

        public String getDesc() {
            return desc;
        }
    }
}
